import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * Created by L.jp
 * Description:实现一个方法，能够生成一个随机字符串数组。这些字符串必须是不一样的，每个字符串由字母和数字组成。方法输入参数有两个：
 * -Count：字符串数目（无默认值）
 * -Str_length: 字符串长度，默认值为10
 * User: 86189
 * Date: 2022-12-10
 * Time: 17:05
 */
public class Solution {
    //把数字和字母的所有都放在数组里，以便读取
    public static void charAll(ArrayList<Character> list){
        for(char i='a';i<='z';i++){
            list.add( i );
        }
        for(char i='A';i<='Z';i++){
            list.add( i );
        }
        for(char i='0';i<='9';i++){
            list.add( i );
        }
    }
    //生成随机字符串数组
    //返回的是一个字符串数组，每一个元素是一个字符串，所以我们首先考虑到使用StringBuilder拼接字符串
    //但是题目要求字符串不能有重复字符，所以我们需要借助两个哈希表来达到去重，一个存储单个的字符串，一个存储总的字符串数组
    //使用随机函数random生成随机下标，从已经存储了字符的list中得到该下标的元素，然后加入临时哈希表
    //如果临时哈希表的长度等于了给定的字符串默认长度，那么就把哈希表中的元素使用stringBuilder拼接好，加入到最终的哈希表，这样单个字符串就好了
    //如果最终哈希表的长度等于了给定的count,那么就把最终哈希表的元素加入到一个数组中，最终返回这个数组即可
    public static List<String> genRandomStr(int Count,int Str_length){
        //最终结果数组
        List<String> result=new ArrayList<>();
        //两个哈希表，一个存储单个字符串，一个存储count个字符串
        HashSet<Object> tmp=new HashSet<>();
        HashSet<Object> all=new HashSet<>();
        //拿到已经存储好的字符数组
        ArrayList<Character> list=new ArrayList<>();
        charAll( list );
        //生成随机数组
        while ( true ){
            //拿到随机一个下标
            int mem= (int) (Math.random()*list.size());
            //根据下标拿到元素
            tmp.add( list.get( mem ) );
            if(tmp.size()==Str_length){
                //那么就可以生成单个字符串了
                StringBuilder stringBuilder = new StringBuilder();
                for(Object obj:tmp){
                    stringBuilder.append(obj.toString());
                }
                all.add( stringBuilder );
                //不断利用这个临时哈希表存储字符
                tmp=new HashSet<>();
            }
            //如果字符串的数量达到了count个，那么就可以结束了
            if(all.size()==Count){
                break;
            }
        }
        //把哈希表的元素转成数组
        for(Object obj:all){
            result.add( obj.toString() );
        }
        return result;
    }
    public static void main (String[] args) {
        System.out.println( genRandomStr( 10 , 10 ) );
    }
}
